package study.linkedlist;

public class SingleLinkedListDemo4 {
    public static void main(String[] args) {
        SingleLinkedList4 singleLinkedList4 = new SingleLinkedList4();
        //按id顺序添加节点
        singleLinkedList4.add(new Node(1,"节点1"));
        singleLinkedList4.add(new Node(2,"节点2"));
        singleLinkedList4.add(new Node(3,"节点3"));
        singleLinkedList4.add(new Node(4,"节点4"));

        System.out.println("======== 删除前 =======");
        singleLinkedList4.list();

        singleLinkedList4.delete(1);
        singleLinkedList4.delete(4);


        System.out.println("======== 删除后 =======");
        singleLinkedList4.list();


    }
}


class SingleLinkedList4{
    private Node head = new Node(0, null);

    //添加节点
    public void add(Node node){
        //先用一个临时节点指向head节点
        Node temp = head;
        //遍历链表，找到尾结点
        //如果temp.next不为空，说明还没到尾结点，继续遍历
        //如果temp.next为空了，说明该节点是尾结点了，将尾结点保存到temp中
        while (temp.next != null){
            //将尾结点保存到temp中
            temp = temp.next;
        }
        //此时temp为尾结点，将尾结点的next指向新节点，完成了添加的操作
        temp.next = node;
    }

    //显示链表
    public void list(){
        //先用一个临时节点指向head节点的next域
        Node temp = head.next;
        //判断链表是否为空
        if (temp == null){
            return;
        }

        //遍历链表：此时的temp为head节点的next（此时不为空了）， 即temp = head.next
        while (temp != null){
            //输出节点信息
            System.out.println(temp);
            //输出完节点信息后，指针接着后移
            temp = temp.next;
        }
    }

    //按照顺序插入
    public void addByOrder(Node node){
        Node temp = head;
        boolean flag = false;   //标识节点是否添加过

        //遍历链表，找尾结点
        while (temp.next != null){
            //如果temp的id大于当前要添加的节点的id，就停止遍历
            if (temp.next.id > node.id){
                break;

            //如果temp的id等于于当前要添加的节点的id，就停止遍历，说明该节点已经添加过了
            }else if (temp.next.id == node.id){
                flag = true;
                break;
            }

            //找到尾结点
            temp = temp.next;
        }

        //如果节点已存在
        if(flag){
            System.out.println(node.id + "节点已存在，无法加入！");
        }else { //节点不存在，就添加节点
            //先将要添加的节点指向temp.next
            node.next = temp.next;
            //再把temp.next指向新节点
            temp.next = node;
        }
    }

    //修改节点信息
    public void update(Node node){
        if (isEmpty()){
            System.out.println("链表为空");
            return;
        }

        Node temp = head.next;
        boolean flag = false;
        //遍历链表
        while (temp != null){
            //当要修改的节点的id等于temp的id时，就找到了要修改的节点
            if (node.id == temp.id){
                //标识找到节点
                flag = true;
                //结束遍历
                break;
            }
            //如果没找到，指针继续后移遍历链表
            temp = temp.next;
        }

        if (flag){  //找到节点，修改数据
            temp.data = node.data;
        }else {
            System.out.println("未找到要修改的节点");
        }


    }

    //判断链表是否为空
    public boolean isEmpty(){
        return head.next == null;
    }

    //删除节点
    public void delete(int nodeID){
        if (isEmpty()){
            System.out.println("链表为空，不能删除");
            return;
        }

        Node temp = head;
        boolean flag = false;    //标识是否找到要删除的链表
        //遍历链表
        while (temp.next != null){
            if (temp.next.id == nodeID){
                flag = true;
                break;
            }

            temp = temp.next;
        }
        if (flag){
            temp.next = temp.next.next;
        }else {
            System.out.println("没有找到要删除的链表");
        }
    }
}


